package br.com.ctm.guiamedico.rest.api;

import java.util.List;

import javax.persistence.PersistenceException;
import javax.ws.rs.core.Response;

import br.com.framework.negocio.exception.NegocioException;
import br.com.framework.persistencia.model.BaseEntity;

/**
 * Interface padrão para implementação de um CRUD atraves de REST
 * @author Cleber
 *
 * @param <E>
 */
public interface EntityResource<E extends BaseEntity> {

	/**
	 * Busca pelo id
	 * 
	 * @param id
	 * @return
	 * @throws PersistenceException
	 */
	E findByID(Long id) throws PersistenceException;

	/**
	 * Busca todos os registros
	 * @return
	 * @throws PersistenceException
	 */
	List<E> findAll() throws PersistenceException;

	/**
	 * Busca todos os registros de forma paginada
	 * @param firstResult
	 * @param maxResults
	 * @return
	 * @throws PersistenceException
	 */
	List<E> findAll(int firstResult, int maxResults)
			throws PersistenceException;

	/**
	 * Busca registros através de um exemplo
	 * @param entidade
	 * @return
	 * @throws PersistenceException
	 */
	List<E> findByExample(E entidade) throws PersistenceException;

	/**
	 * Retorna a quantidade de registros
	 * @return
	 * @throws PersistenceException
	 */
	Long getRecordCount() throws PersistenceException;

	/**
	 * Insere um novo registro
	 * @param entidade
	 * @return
	 * @throws NegocioException
	 * @throws PersistenceException
	 */
	Response insert(E entidade) throws NegocioException, PersistenceException;

	/**
	 * Modifica um registro existente
	 * 
	 * @param id
	 * @param entidade
	 * @return
	 * @throws NegocioException
	 * @throws PersistenceException
	 */
	Response update(Long id, E entidade) throws NegocioException,
			PersistenceException;

	/**
	 * Remove um registro existente
	 * @param id
	 * @return
	 * @throws NegocioException
	 * @throws PersistenceException
	 */
	Response remove(Long id) throws NegocioException, PersistenceException;

}